﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AexoManager.Datos;

namespace AexoManager.BussinesLogic
{
    public class BSRegistroProceso : BSParent
    {

        public RegistroProceso Get(int idRegistroProceso)
        {
            var registroProceso = context().RegistroProcesoObtener(idRegistroProceso);

            return registroProceso;
        }

        /// <summary>
        /// Obtiene un DTORegistroProceso que este Iniciado y no tenga fecha de fin a partir de un Codigo de parte. 
        /// </summary>
        /// <param name="dtoParte"></param>
        /// <returns></returns>
        public RegistroProceso GetIniciado(Parte dtoParte)
        {
            var registroProceso = context().RegistroProcesoGetIniciado(dtoParte.Codigo);

            return registroProceso;
        }


        /// <summary>
        /// Obtiene una lista de DTOReistroProceso que no posea fecha fin a partir de un IdParte e IdUsuario
        /// </summary>
        /// <param name="dtoParte"></param>
        /// <param name="dtoUsuario"></param>
        /// <returns></returns>
        public IList<RegistroProceso> ObtenerIniciados(Parte dtoParte, Proceso dtoProceso, Empleado dtoEmpleado)
        {
            var result = context().RegistroProcesoObtenerIniciados(dtoParte.IdParte, dtoProceso.IdProceso, dtoEmpleado.IdEmpleado);

            return result;
        }

        /// <summary>
        /// Obtiene una lista de DTORegistroProceso que no posean fecha de fin.
        /// </summary>
        /// <returns></returns>
        public IList<RegistroProceso> ObtenerIniciados()
        {
            var result = context().RegistroProcesoObtenerIniciados();

            return result;
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="idParte"></param>
        /// <param name="idUsuario"></param>
        /// <param name="idProceso"></param>
        /// <returns></returns>
        public IList<RegistroProceso> ObtenerNoFinalizado(int idParte, int? idUsuario, int? idProceso)
        {
            var lista = context().RegistroProcesoObtenerNoFinalizado(idParte, idUsuario, idProceso);

            return lista;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IList<RegistroProceso> ObtenerFinalizados()
        {
            var lista = context().RegistroProcesoObtenerFinalizados();

            return lista;
        }

        /// <summary>
        /// Obtiene los registros que estan pausados y no finalizados.
        /// </summary>
        /// <param name="idParte"></param>
        /// <param name="idUsuario"></param>
        /// <param name="idProceso"></param>
        /// <returns></returns>
        public IList<RegistroProceso> ObtenerPausados(int idParte, int? idUsuario, int? idProceso)
        {
            var listaNoFinalizados = context().RegistroProcesoObtenerNoFinalizado(idParte, idUsuario, idProceso);
            var listaFinalizados = context().RegistroProcesoObtenerFinalizados();

            var listaPausados = (from u in listaNoFinalizados
                                where !(from g in listaFinalizados
                                        select g.IdComienzo)
                                        .Contains(u.IdComienzo)
                                select new RegistroProceso
                                    {
                                        IdRegistroProceso = u.IdRegistroProceso,
                                        Parte = u.Parte,
                                        Proceso = u.Proceso,
                                        Cantidad = u.Cantidad,
                                        Inicio = u.Inicio,
                                        IdComienzo = u.IdComienzo,
                                        Empleado = u.Empleado
                                    }).ToList();
            //var listaPausados = listaNoFinalizados.Except(listaFinalizados).ToList();

            return listaPausados;
        }

        /// <summary>
        /// Obtiene una lista de RegistrosProcesos pausados
        /// </summary>
        /// <param name="idUsuario"></param>
        /// <param name="idProceso"></param>
        /// <returns></returns>
        public IList<RegistroProceso> ObtenerPausados(int? idUsuario, int? idProceso)
        {
            var listaNoFinalizados = context().RegistroProcesoObtenerNoFinalizado(null, idUsuario, idProceso);
            var listaFinalizados = context().RegistroProcesoObtenerFinalizados();

            IList<RegistroProceso> listaIniciados = this.ObtenerIniciados();

            var listaPausados = listaNoFinalizados
                                    .Where(e => !listaFinalizados.Select(s => s.IdComienzo).Contains(e.IdComienzo))
                                    .Where(x => !listaIniciados.Select(s => s.IdComienzo).Contains(x.IdComienzo))
                                .ToList();

           return listaPausados;
        }

        /// <summary>
        /// Obtiene el Maximo IdComienzo de la tabla RegistroProceso
        /// </summary>
        /// <returns></returns>
        public int MaxIdComienzo()
        {
            return context().RegisroProcesoMaxIdComienzo();
        }


        /// <summary>
        /// Guarda un registro en la base.
        /// </summary>
        /// <param name="dtoRegistro"></param>
        public void Save(RegistroProceso dtoRegistro)
        {
            context().RegistroProcesoSave(dtoRegistro);
        }

        /// <summary>
        /// Actualiza Fecha Fin y marca Finalizo
        /// </summary>
        /// <param name="unRegistro"></param>
        public void ActualizarEstado(RegistroProceso unRegistro)
        {
            var registroProceso = context().RegistroProcesoGetIniciado(unRegistro.Parte.Codigo);
            registroProceso.Fin = unRegistro.Fin;
            registroProceso.Finalizo = unRegistro.Finalizo;
        }

    }
}
